gdk: Add gdk_seat_get_master_pointers()
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 27 Nov 2017 19:21:42 +0000 (20:21 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 8 Dec 2017 02:27:14 +0000 (21:27 -0500)
Traditionally (and on most backends) there's a single master pointer driven
by all pointing devices. The notable exception is Wayland though, where
master pointing devices are created per capability in the case of
pointer/touch, and one for each drawing tablet.

This function call makes it easy to access all these.

https://bugzilla.gnome.org/show_bug.cgi?id=790920

docs/reference/gdk/gdk4-sections.txt
gdk/gdkseat.c
gdk/gdkseat.h
gdk/gdkseatdefault.c
gdk/gdkseatprivate.h
gdk/wayland/gdkdevice-wayland.c

index bd5d05d9a1bfa39fc04a289e8ab9dfb734c9802f..63b09bb198ba4d2eb3b92f46d02848c9a8d7d5b4 100644 (file)
@@ -673,6 +673,7 @@ gdk_seat_get_capabilities
 gdk_seat_get_pointer
 gdk_seat_get_keyboard
 gdk_seat_get_slaves
+gdk_seat_get_master_pointers
 
 <SUBSECTION Standard>
 GDK_SEAT
index a507d451bd31cc8c9978944df6ce94b31cb8efff..c22400324a884782027352a3a2e9edf1bb809a3b 100644 (file)
@@ -458,3 +458,29 @@ gdk_seat_get_tool (GdkSeat *seat,
   seat_class = GDK_SEAT_GET_CLASS (seat);
   return seat_class->get_tool (seat, serial);
 }
+
+/**
+ * gdk_seat_get_master_pointers:
+ * @seat: The #GdkSeat
+ * @capabilities: Queried capabilities
+ *
+ * Returns all master pointers with the given capabilities driven by this @seat.
+ * On most backends this function will return a list with a single element (meaning
+ * that all input devices drive the same onscreen cursor).
+ *
+ * In other backends where there can possibly be multiple foci (eg. wayland),
+ * this function will return all master #GdkDevices that represent these.
+ *
+ * Returns: (transfer container) (element-type GdkDevice): A list
+ * of master pointing devices
+ *
+ * Since: 3.93.
+ */
+GList *
+gdk_seat_get_master_pointers (GdkSeat             *seat,
+                              GdkSeatCapabilities  capabilities)
+{
+  g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
+
+  return GDK_SEAT_GET_CLASS (seat)->get_master_pointers (seat, capabilities);
+}
index b4ce279b76c0b3a0647839f25cbef70a054a5837..f60b93dd667c31bd53ad5dd69e39b94079238936 100644 (file)
@@ -112,6 +112,10 @@ GdkDevice *    gdk_seat_get_pointer      (GdkSeat             *seat);
 GDK_AVAILABLE_IN_3_20
 GdkDevice *    gdk_seat_get_keyboard     (GdkSeat             *seat);
 
+GDK_AVAILABLE_IN_3_93
+GList *        gdk_seat_get_master_pointers (GdkSeat             *seat,
+                                             GdkSeatCapabilities  capabilities);
+
 G_END_DECLS
 
 #endif /* __GDK_SEAT_H__ */
index 32a441f708c83ad1933d68980bb9f45acbbf8da1..bf3f41098bac73ccfc34e8ace7f88e73218d52c1 100644 (file)
@@ -299,6 +299,18 @@ gdk_seat_default_get_tool (GdkSeat *seat,
   return NULL;
 }
 
+static GList *
+gdk_seat_default_get_master_pointers (GdkSeat             *seat,
+                                      GdkSeatCapabilities  capabilities)
+{
+  GList *masters = NULL;
+
+  if (capabilities & GDK_SEAT_CAPABILITY_ALL_POINTING)
+    masters = g_list_prepend (masters, gdk_seat_get_pointer (seat));
+
+  return masters;
+}
+
 static void
 gdk_seat_default_class_init (GdkSeatDefaultClass *klass)
 {
@@ -314,6 +326,7 @@ gdk_seat_default_class_init (GdkSeatDefaultClass *klass)
 
   seat_class->get_master = gdk_seat_default_get_master;
   seat_class->get_slaves = gdk_seat_default_get_slaves;
+  seat_class->get_master_pointers = gdk_seat_default_get_master_pointers;
 
   seat_class->get_tool = gdk_seat_default_get_tool;
 }
index bd66f68bf56a3f57ab8468380e2de07fbf4e572a..22cdd08189fcf58d48712a1f6e3c0c27d57a1cd2 100644 (file)
@@ -58,6 +58,8 @@ struct _GdkSeatClass
 
   GdkDeviceTool * (* get_tool) (GdkSeat *seat,
                                 guint64  serial);
+  GList *     (* get_master_pointers) (GdkSeat             *seat,
+                                       GdkSeatCapabilities  capabilities);
 };
 
 void gdk_seat_device_added   (GdkSeat   *seat,
index 5b067bfa77bac96a23259ef996d37baad8ecad58..02f9418a7ec81cb1263e26adf18ee126db8f3ed7 100644 (file)
@@ -4714,6 +4714,32 @@ gdk_wayland_seat_get_slaves (GdkSeat             *seat,
   return slaves;
 }
 
+static GList *
+gdk_wayland_seat_get_master_pointers (GdkSeat             *seat,
+                                      GdkSeatCapabilities  capabilities)
+{
+  GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
+  GList *masters = NULL;
+
+  if (capabilities & GDK_SEAT_CAPABILITY_POINTER)
+    masters = g_list_prepend (masters, wayland_seat->master_pointer);
+  if (capabilities & GDK_SEAT_CAPABILITY_TOUCH)
+    masters = g_list_prepend (masters, wayland_seat->touch_master);
+  if (capabilities & GDK_SEAT_CAPABILITY_TABLET_STYLUS)
+    {
+      GList *l;
+
+      for (l = wayland_seat->tablets; l; l = l->next)
+        {
+          GdkWaylandTabletData *tablet = l->data;
+
+          masters = g_list_prepend (masters, tablet->master);
+        }
+    }
+
+  return masters;
+}
+
 static void
 gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
 {
@@ -4727,6 +4753,7 @@ gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
   seat_class->ungrab = gdk_wayland_seat_ungrab;
   seat_class->get_master = gdk_wayland_seat_get_master;
   seat_class->get_slaves = gdk_wayland_seat_get_slaves;
+  seat_class->get_master_pointers = gdk_wayland_seat_get_master_pointers;
 }
 
 static void